package Modelo;

// Crear clase servicios y añadir metodos para manejar el 
//CRUD, fijate en usuarios (Crear, leer, actualizar, borrar)
import java.sql.*;

public class Servicios {

    Connection con;

    public Servicios() {

        this.con = Conexion.getConexion();
    }
// Obtener servicios

    public Object[][] getServicios() {

        Object[][] filas = null;
        try {
            Statement query = this.con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ResultSet res = query.executeQuery("SELECT * FROM Servicios");
            //Clase para obtener más datos sobre la consulta
            ResultSetMetaData resmd = res.getMetaData();
            //Obtengo el total de columnas de la consulta
            int totalColumnas = resmd.getColumnCount();
            res.last();
            //obtengo el total de filas
            int totalFilas = res.getRow();
            res.beforeFirst();

            //Creo el objeto filas
            filas = new Object[totalFilas][totalColumnas];

            //Mientras hallan resultados poblo el objeto filas para luego devolverlo
            while (res.next()) {
                for (int i = 0; i < totalColumnas; i++) {
                    filas[(res.getRow() - 1)][i] = res.getString((i + 1));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return filas;
    }

    // Obtener servicios
    public Object[][] getServiciosByCliente(String rut) {

        Object[][] filas = null;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT ser.nombre "
                    + "FROM Contrato as con INNER JOIN Servicios as ser "
                    + "ON con.id_servicio = ser.id_servicio "
                    + "WHERE con.cliente_rut=?");
            query.setString(1, rut);
            ResultSet res = query.executeQuery();

            //Clase para obtener más datos sobre la consulta
            ResultSetMetaData resmd = res.getMetaData();
            //Obtengo el total de columnas de la consulta
            int totalColumnas = resmd.getColumnCount();
            res.last();
            //obtengo el total de filas
            int totalFilas = res.getRow();
            res.beforeFirst();

            //Creo el objeto filas
            filas = new Object[totalFilas][totalColumnas];

            //Mientras hallan resultados poblo el objeto filas para luego devolverlo
            while (res.next()) {
                for (int i = 0; i < totalColumnas; i++) {
                    filas[(res.getRow() - 1)][i] = res.getString((i + 1));
                }
            }
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return filas;
    }

    public Object[] getServicio(int id_servicio) {
        Object[] filas = null;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT nombre FROM Servicios WHERE id_servicio=?");
            query.setInt(1, id_servicio);
            ResultSet res = query.executeQuery();

            //Clase para obtener más datos sobre la consulta
            ResultSetMetaData resmd = res.getMetaData();
            //Obtengo el total de columnas de la consulta
            int totalColumnas = resmd.getColumnCount();

            //Creo el objeto filas
            filas = new Object[totalColumnas];

            //Mientras hallan resultados poblo el objeto filas para luego devolverlo
            if (res.next()) {
                for (int i = 0; i < totalColumnas; i++) {
                    filas[i] = res.getString((i + 1));
                }
            }
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return filas;
    }
    
    public String getNombrePlanByClienteYServicio(String rut, int id_servicio){
        String nombre_plan = null;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT p.nombre FROM Planes as p INNER JOIN Contrato as c "
                    + "ON p.id_plan = c.id_plan "
                    + "WHERE c.cliente_rut=? AND c.id_servicio=?");
            query.setString(1, rut.trim());
            query.setInt(2, id_servicio);
            ResultSet res = query.executeQuery();
            
            //Si existe el cliente
            if(res.next()){
                nombre_plan = res.getString(1);
            }else{
                return null;
            }
            
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return nombre_plan;

    }
    
    public Object[][] getPlanesByServicio(int id_servicio){
        Object[][] filas = null;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT nombre FROM Planes "
                    + "WHERE id_servicio=?");
            query.setInt(1, id_servicio);
            ResultSet res = query.executeQuery();

            //Clase para obtener más datos sobre la consulta
            ResultSetMetaData resmd = res.getMetaData();
            //Obtengo el total de columnas de la consulta
            int totalColumnas = resmd.getColumnCount();
            res.last();
            //obtengo el total de filas
            int totalFilas = res.getRow();
            res.beforeFirst();

            //Creo el objeto filas
            filas = new Object[totalFilas][totalColumnas];

            //Mientras hallan resultados poblo el objeto filas para luego devolverlo
            while (res.next()) {
                for (int i = 0; i < totalColumnas; i++) {
                    filas[(res.getRow() - 1)][i] = res.getString((i + 1));
                }
            }
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return filas;
    }
   
    
    
    public Object[][] getServicioNoTieneCliente(String rut) {
        Object[][] filas = null;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT nombre FROM Servicios "
                    + "WHERE id_servicio NOT IN( SELECT id_servicio FROM Contrato WHERE cliente_rut=? )");
            query.setString(1, rut);
            ResultSet res = query.executeQuery();
 
            //Clase para obtener más datos sobre la consulta
            ResultSetMetaData resmd = res.getMetaData();
            //Obtengo el total de columnas de la consulta
            int totalColumnas = resmd.getColumnCount();
            res.last();
            //obtengo el total de filas
            int totalFilas = res.getRow();
            res.beforeFirst();
 
            //Creo el objeto filas
            filas = new Object[totalFilas][totalColumnas];
 
            //Mientras hallan resultados poblo el objeto filas para luego devolverlo
            while (res.next()) {
                for (int i = 0; i < totalColumnas; i++) {
                    filas[(res.getRow() - 1)][i] = res.getString((i + 1));
                }
            }
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return filas;
    }
    
    public int getIdServicioByNombre(String nombre){
        int id_servicio = -1;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT id_servicio FROM Servicios "
                    + "WHERE nombre=?");
            query.setString(1, nombre.trim());
            ResultSet res = query.executeQuery();
            //Clase para obtener más datos sobre la consulta
            ResultSetMetaData resmd = res.getMetaData();
            //Obtengo el total de columnas de la consulta
            int totalColumnas = resmd.getColumnCount();
            
            //Creo el objeto filas

            
            //Si existe el cliente
            if(res.next()){
                for (int i = 0; i < totalColumnas; i++) {
                    id_servicio = res.getInt(i+1);
                }
            }else{
                return -1;
            }
            
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return id_servicio;
    }
    
    public int getIdPlanByNombre(String nombre){
        int id_servicio = -1;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT id_plan FROM Planes "
                    + "WHERE nombre=?");
            query.setString(1, nombre.trim());
            ResultSet res = query.executeQuery();
            //Clase para obtener más datos sobre la consulta
            ResultSetMetaData resmd = res.getMetaData();
            //Obtengo el total de columnas de la consulta
            int totalColumnas = resmd.getColumnCount();
            
            //Creo el objeto filas

            
            //Si existe el cliente
            if(res.next()){
                for (int i = 0; i < totalColumnas; i++) {
                    id_servicio = res.getInt(i+1);
                }
            }else{
                return -1;
            }
            
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return id_servicio;
    }
    
    public int getIdPlanByNombreYServicio(String nombre,int id_servicio){
        int id_plan = -1;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT id_plan FROM Planes "
                    + "WHERE nombre=? AND id_servicio=?");
            query.setString(1, nombre.trim());
            query.setInt(2, id_servicio);
            ResultSet res = query.executeQuery();
            //Clase para obtener más datos sobre la consulta
            ResultSetMetaData resmd = res.getMetaData();
            //Obtengo el total de columnas de la consulta
            int totalColumnas = resmd.getColumnCount();
            
            //Creo el objeto filas

            
            //Si existe el cliente
            if(res.next()){
                for (int i = 0; i < totalColumnas; i++) {
                    id_plan = res.getInt(i+1);
                }
            }else{
                return -1;
            }
            
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return id_plan;
    }
    
// Eliminar Servicio.

    public void deleteServicio(int id_servicio) {
        try {
            PreparedStatement query = this.con.prepareStatement("DELETE FROM Servicios WHERE id_servicio=?");
            query.setInt(1, id_servicio);
            query.executeUpdate();
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
// Agregar servicio

    public boolean addServicio(String nombre) {

        if (this.existeServicio(nombre.trim())) {
            Funciones.mensaje("El servicio ya existe, prueba con otro");
            return false;
        }
        try {
            PreparedStatement query = this.con.prepareStatement("INSERT INTO Servicios (nombre) values (?);");
            query.setString(1, nombre.trim());

            query.executeUpdate();
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return true;
    }
    
    public boolean existeServicioCliente(String rut, int id_servicio) {
        boolean existe = false;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT id_servicio FROM Contrato "
                    + "WHERE cliente_rut=? AND id_servicio=?");
            query.setString(1, rut.trim());
            query.setInt(2, id_servicio);
            query.executeQuery();
            ResultSet res = query.executeQuery();
 
            if (res.next()) {
                existe = true;
            } else {
                existe = false;
            }
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return existe;
    }
    
    public boolean addServicioToCliente(String rut, int id_servicio) {
 
        if (this.existeServicioCliente(rut, id_servicio)) {
            Funciones.mensaje("El servicio ya lo posee el cliente");
            return false;
        }
        try {
            PreparedStatement query = this.con.prepareStatement("INSERT INTO Contrato (cliente_rut, id_servicio)"
                    + " values (?, ?);");
            query.setString(1, rut.trim());
            query.setInt(2, id_servicio);
            query.executeUpdate();
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return true;
    }
    
    public boolean addPlan(String nombre, int id_servicio) {
 
        if (this.existePlan(nombre.trim(), id_servicio)) {
            Funciones.mensaje("El plan ya existe, prueba con otro");
            return false;
        }
        try {
            PreparedStatement query = this.con.prepareStatement("INSERT INTO Planes (nombre, id_servicio) values (?, ?);");
            query.setString(1, nombre.trim());
            query.setInt(2, id_servicio);
            query.executeUpdate();
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return true;
    }
    
    public boolean updatePlan(String nombre, int id_plan, int id_servicio) {
 
        if (this.existePlan(nombre.trim(), id_servicio)) {
            return false;
        }
        try {
            PreparedStatement query = this.con.prepareStatement("UPDATE Planes SET nombre=? WHERE id_plan=? ;");
            query.setString(1, nombre.trim());
            query.setInt(2, id_plan);
            query.executeUpdate();
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return true;
    }
    
    public boolean addPlanToCliente(String rut, int id_servicio, int id_plan) {
        //Si el cliente ya tiene el plan
        if (this.existePlanCliente(rut, id_servicio, id_plan)) {
            return false;
        }
        
        try {
            PreparedStatement query = this.con.prepareStatement("UPDATE Contrato SET id_plan=? "
                    + "WHERE cliente_rut=? AND id_servicio =?;");            
            query.setInt(1, id_plan);
            query.setString(2, rut.trim());
            query.setInt(3, id_servicio);
            query.executeUpdate();
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return true;
    }

    // Comprobar si ya existe el servicio.
    public boolean existeServicio(String nombre) {
        boolean existe = false;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT id_servicio FROM Servicios WHERE nombre=?");
            query.setString(1, nombre.trim());
            query.executeQuery();
            ResultSet res = query.executeQuery();

            if (res.next()) {
                existe = true;
            } else {
                existe = false;
            }
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return existe;
    }
    
    public boolean existePlanCliente(String cliente_rut, int id_servicio, int id_plan) {
        boolean existe = false;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT id_contrato FROM Contrato "
                    + "WHERE cliente_rut=? AND id_servicio=? AND id_plan=?");
            query.setString(1, cliente_rut.trim());
            query.setInt(2, id_servicio);
            query.setInt(3, id_plan);
            query.executeQuery();
            ResultSet res = query.executeQuery();

            if (res.next()) {
                existe = true;
            } else {
                existe = false;
            }
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return existe;
    }
    
    public boolean existePlan(String nombre, int id_servicio) {
        boolean existe = false;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT id_plan FROM Planes "
                    + "WHERE nombre=? AND id_servicio=?");
            query.setString(1, nombre.trim());
            query.setInt(2, id_servicio);
            query.executeQuery();
            ResultSet res = query.executeQuery();

            if (res.next()) {
                existe = true;
            } else {
                existe = false;
            }
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return existe;
    }

    // Modificar servicio
    public void updateServicio(String nombre, int id) {
        try {
            PreparedStatement pstm = this.con.prepareStatement("UPDATE Servicios "
                    + "set nombre= ? "
                    + "where id_servicio = ? ");
            pstm.setString(1, nombre);
            pstm.setInt(2, id);
            pstm.execute();
            pstm.close();
        } catch (SQLException e) {
            System.out.println(e);
        }
    }
    
    public void deleteServicioCliente(String rut, int id_servicio) {
        try {            
            PreparedStatement query = this.con.prepareStatement("DELETE FROM Contrato "
                    + "WHERE cliente_rut=? AND id_servicio=?");
            query.setString(1, rut);
            query.setInt(2, id_servicio);
            query.executeUpdate();
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    
    
    public void deletePlan(int id_plan) {
        try {
            PreparedStatement query = this.con.prepareStatement("DELETE FROM Planes WHERE id_plan=?");
            
            query.setInt(1, id_plan);
            query.executeUpdate();
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    
}
